package com.ldl.exam.service;

import com.github.pagehelper.PageInfo;
import com.ldl.exam.entity.ExamPaper;
import com.ldl.exam.entity.QuestionWithBLOBs;
import com.ldl.exam.entity.StuExamAnswer;
import com.ldl.exam.entity.StuExamPaper;
import com.ldl.exam.exception.ExamException;

import java.util.List;

/**
 * @author liudaolin
 * @version 1.0
 * @date 2022/10/02 15:22:38
 */
public interface ExamPaperService {
    /**
     * 查询学生的试卷基本信息
     * @param stuId
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageInfo<StuExamPaper> findExamsByStuIdAndPage(Integer stuId, int pageNum, int pageSize);

    /**
     * 预览某个学生的某个试卷内容
     * @param stuId
     * @param examPaperId
     * @return
     */
    StuExamPaper previewExamByStuIdAndExamId(Integer stuId, Integer examPaperId);

    /**
     * 创建Java考试返回考试码
     * @param name 试卷名称
     * @param language 主要编程语言
     * @param choiceCount 选择题数量
     * @param shortCount 简答题数量
     * @param programmingCount 编程题数量
     * @return
     */
    String createJavaExam(String name, String language, int choiceCount, int shortCount, int programmingCount);

    /**
     * 创建试卷
     * @param examName 试卷名称
     * @return 考试码, 由 yyyyMMdd + 4位随机字母数字 + examPaperId
     */
    String createExamPaper(String examName);

    /**
     * 获取正在考试的试卷内容
     * @param code 考试码
     * @return
     * @throws ExamException
     */
    ExamPaper findExam(String code) throws ExamException;

    /**
     * 校验考试码
     * @param code
     * @throws ExamException
     */
    void checkExamCode(String code) throws ExamException;

    /**
     * 保存学生某次考试的所有题目的答案
     * @param examPaperId
     * @param stuId
     * @param count
     * @param answers
     * @throws ExamException
     */
    void addStuAnswers(Integer examPaperId, Integer stuId, Integer count, List<StuExamAnswer> answers) throws ExamException;

    /**
     * 结束考试, 自动批改选择题
     * @param examPaperId
     * @throws ExamException
     */
    void finishExam(Integer examPaperId) throws ExamException;

    /**
     * 修改学生的各个题目的得分
     * @param examPaperId 试卷编号
     * @param stuId 学生编号
     * @param answers StuExamAnswer 需要有 id, score, questionId
     * @param totalScore 学生本次总得分
     * @throws ExamException
     */
    void updateStuExamAnswerScore(Integer examPaperId, Integer stuId, List<StuExamAnswer> answers, Integer totalScore) throws ExamException;

    /**
     * 修改 ExamPaper 状态为 开始考试
     * @param examPaperId
     * @throws ExamException
     */
    void startExam(Integer examPaperId) throws ExamException;

    /**
     * 分页查询试卷的基本信息
     * @param pageNum
     * @param pageSize
     * @return
     * @throws ExamException
     */
    PageInfo<ExamPaper> findExamsByPage(int pageNum, int pageSize) throws ExamException;

    /**
     * 分页查询某次考试的所有学生的试卷基本信息(含学生基本信息)
     * @param examPaperId
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageInfo<StuExamPaper> findStuExamsByExamPaperIdAndPage(Integer examPaperId, int pageNum, int pageSize);

    /**
     * 对某次考试的成绩进行排名, 并修改试卷的状态为 已排名
     * @param examPaperId
     * @throws ExamException
     */
    void examRanking(Integer examPaperId) throws ExamException;

    /**
     * 删除试卷, 状态 已创建 的试卷 执行真删除(包括详情等关联的数据), 状态 考试中 的试卷 修改状态为 已删除, 其他的状态无法删除
     * @param examPaperId
     * @throws ExamException
     */
    void removeExam(Integer examPaperId) throws ExamException;

    /**
     * 查看试卷的题目, 不含答案
     * @param examPaperId
     */
    List<QuestionWithBLOBs> findExamQuestionsById(Integer examPaperId);

    /**
     * 分页查询题目库中所有题目
     * @param pageNum
     * @param pageSize
     * @param typeId 题目类别id
     * @param language 题目语言
     * @return
     */
    PageInfo<QuestionWithBLOBs> findQuestionsByPage(int pageNum, int pageSize, Integer typeId, String language);

    /**
     * 把选中的题目加入试卷
     * @param examPaperId
     * @param questionIdList
     * @throws ExamException
     */
    void addQuestionToExam(Integer examPaperId, List<Integer> questionIdList) throws ExamException;

    /**
     * 把选中的题目从试卷中移除
     * @param examPaperId
     * @param questionIdList
     * @throws ExamException
     */
    void removeQtFromExam(Integer examPaperId, List<Integer> questionIdList) throws ExamException;
}
